package myssh

import (
	"fmt"
	"gofile/encodejson"
	"log"
	"os"

	"golang.org/x/crypto/ssh"
)

func SshShell() {
	config, err := encodejson.GetConfig()

	if err != nil {
		log.Fatal("解码JSON配置出错", err)
		return
	}

	sshConfig := &ssh.ClientConfig{
		User: config.SshUser,
		Auth: []ssh.AuthMethod{
			// ssh.Password(config.SshPassWord),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}

	if config.SshKey != "" {
		privateKeyData, err := os.ReadFile(config.SshKey)
		if err != nil {
			log.Fatal("ssh密钥读取失败", err)
		}
		// 解析私钥数据为 ssh.PrivateKey 类型
		privateKey, err := ssh.ParsePrivateKey(privateKeyData)
		if err != nil {
			log.Fatal("解析私钥数据失败", err)
		}
		sshConfig.Auth = append(sshConfig.Auth, ssh.PublicKeys(privateKey))
	} else if config.SshPassWord != "" {
		sshConfig.Auth = append(sshConfig.Auth, ssh.Password(config.SshPassWord))
	} else {
		log.Fatal("ssh连接密码或者密钥不能为空")
	}

	host := fmt.Sprintf("%s:%d", config.SshHost, config.SshPort)
	sshClient, err := ssh.Dial("tcp", host, sshConfig)
	if err != nil {
		log.Fatal("无法建立 SSH 连接:", err)
	}
	defer sshClient.Close()

	// 注意每执行每个命令都在一个新的会话中执行，不会保留前一个命令的状态，shell命令写在一行的原因
	newSession, err := sshClient.NewSession()
	if err != nil {
		log.Fatal("创建session失败:", err)
	}
	cmd := "cd " + config.RemoteDir + ";rm -fr /dist;unzip dist.zip;rm dist.zip;ls"
	output, err := newSession.CombinedOutput(cmd)
	if err != nil {
		log.Fatal("命令执行失败:", err)
	}
	fmt.Println(string(output))

	defer newSession.Close()

	fmt.Println("脚本执行完成,上传远程目录:" + config.RemoteDir)
}
